

package sisgraf.impressao;


import javax.print.*;
import javax.swing.JOptionPane;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;

    // Essa classe é a responsavel pela impressao. Ela detecta a impressora
    // instalada, recebe o texto e o imprime.
    public final class Imprimir {

       private static ArrayList lista = new ArrayList();
       private static int coluna;

    public Imprimir(ArrayList lista,int col)
        {
         setRecebeLista(lista);
         setRecebeNumCol(col);

        }
       
      private static PrintService impressora;
        // O metodo verifica se existe impressora conectada e a
        // define como padrao.
        public static String[] detectaImpressoras() {
            int i = 0;
            try {

                DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
                PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
 
                for (PrintService p: ps){
                   p.getName();
                     i++;
                }
             String[] lista = new String [i];
           int j = 0;
              for (PrintService p: ps){
                   lista[j]=p.getName();
                     j++;
                }
              return lista;
                }

            catch (Exception e) {
                e.printStackTrace();

            }
            return null;
        }

        public static synchronized boolean imprime(String impressora) {
                 String texto="";
                 String espaco="  ";
                 ArrayList lister = new ArrayList();
                 int maior=0;
                 int i=1;
                 for(Object list:getRecebeLista())
                 {
                     if(list.toString().length()>maior)
                         maior=list.toString().length();

                 }

                 for(Object list:getRecebeLista())
                 {
                     for(int w=0;w<=maior-list.toString().length()+2;w++)
                         espaco=espaco+"-";
                         lister.add(list.toString()+""+espaco);
                         espaco="  ";
                 }

                 for(Object list:lister)
                 {
                     texto=texto+""+list.toString()+" ";
                  
                     if(i==getRecebeNumCol())
                     {
                         texto=texto+"\n_____________________________________________________________________________________________________________________\n";
                         i=0;
                     }
                     i++;
                 }
              JOptionPane.showMessageDialog(null,texto);
            try {

                DocFlavor df = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
                PrintService[] ps = PrintServiceLookup.lookupPrintServices(df, null);
                for (PrintService p: ps) {

                    if (p.getName().equals(impressora))  {
                        Imprimir.impressora = p;
                        break;

                    }

                }

            } catch (Exception e) {
                e.printStackTrace();

            }
            // se nao existir impressora, entao avisa usuario
            // senao imprime texto
            if (Imprimir.impressora == null) {

                String msg = "Nennhuma impressora foi encontrada. Instale uma impressora padrão e reinicie o programa.";
               JOptionPane.showMessageDialog(null,msg);

            } else {

                try {

                    DocPrintJob dpj = Imprimir.impressora.createPrintJob();
                    InputStream stream = new ByteArrayInputStream(texto.getBytes());

                    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
                    Doc doc = new SimpleDoc(stream, flavor, null);
                    dpj.print(doc, null);

                    return true;

                } catch (PrintException e) {

                    e.printStackTrace();

                }

            }

            return false;

        }
public void setRecebeLista(ArrayList lista)
    {
     Imprimir.lista=lista;
    }
public static ArrayList getRecebeLista()
    {
    return Imprimir.lista;
    }

public void setRecebeNumCol(int col)
    {
     Imprimir.coluna=col;
    }
public static int getRecebeNumCol()
    {
    return Imprimir.coluna;
    }
    }